/**
 * @file Date.h
 * @brief Fichier d'entête du module date.
 *
 * @author Mohammad NOROUZZADEH, Lotfi, Saleh
 */
#ifndef _DATE_H
#define _DATE_H

/* *********************************************************************
                   Librairies de Date
 ********************************************************************* */
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>

/* *********************************************************************
                        Définitions de types
 ********************************************************************* */

/**
 * @struct sDate
 * @brief Structure utilisée pour la gestion des dates.
 *
 * Cette structure est utilisée pour gérer une date.
 Les champs de cette structures doivent être modifiés ou lus
 par les accesseurs et mutateurs.
 */

struct sDate {
  unsigned char jour; /** Jour */
  unsigned char mois; /** Mois */
  unsigned int annee; /** Années */
  unsigned char heure;
  unsigned char minute;
} ;

/**
 * @typedef Date
 * @brief Redéfinit la structure sDate
 */
typedef struct sDate Date ;

/* *********************************************************************
         	 Fonction de la structure Date
********************************************************************* */

/**
 * @fn void init_Dat(Date * date);
 * @brief Initilise une date
 *
 * @param[in,out] Date pointeur sur Date
 */
void initDat(Date *date, const unsigned char jour, const unsigned char mois,
             const unsigned int annee,const unsigned char heure,const unsigned char minute);

/**
 * @fn void liberer_Dat(Date * date);
 * @brief Libère la date
 *
 * @param[in,out] date pointeur sur Date
 */
void libDat(Date * date);

/**
 * @fn Date * creer_Dat() ;
 * @brief Crée une date dans le tas
 *
 * @return un pointeur sur Date
 */
Date * creDat(const unsigned char jour, const unsigned char mois,
              const unsigned int annee,const unsigned char heure,const unsigned char minute);

/**
 * @fn void detruire_Dat(Date ** date);
 * @brief Détruis une date du tas
 *
 * @param[in,out] date pointeur sur Date
 */
void detDat(Date ** date);

/**
 * @fn void cpy_Dat(Date * dateDest, const Date * dateSrc);
 * @brief Copie dans dateDest la dateSrc
 *
 * @param[in,out] dateDest pointeur sur Date
 * @param dateSrc la date que l'on veut copier
 */
void copieDat(Date ** dateDest, const Date * dateSrc);

/* *********************************************************************
           Accesseurs et Mutateurs de la structure Date
 ********************************************************************* */

/**
 * @fn unsigned char getJour_Dat(const Date date) ;
 * @brief récupère le jour de date
 *
 * @param date
 * @return le jour de date
 */
unsigned char getJourDat(const Date *date) ;

/**
 * @fn void setJour_Dat(Date date, unsigned char jour) ;
 * @brief initialise le jour de la date
 *
 * @param[in, out] date date à modifier
 * @param jour
 */
void setJourDat(Date *date, const unsigned char jour) ;


/**
 * @fn unsigned char getMois_Dat(const Date date) ;
 * @brief récupère le mois de date
 *
 * @param date
 * @return le mois de date
 */
unsigned char getMoisDat(const Date *date) ;

/**
 * @fn void setMois_Dat(Date date, unsigned char mois) ;
 * @brief initialise le mois de la date
 *
 * @param[in, out] date date à modifier
 * @param mois
 */
void setMoisDat(Date *date, const unsigned char mois) ;

/**
 * @fn signed int getAnnee_Dat(const Date date) ;
 * @brief récupère l'annee de date
 *
 * @param date
 * @return l'annee de date
 */
unsigned int getAnneeDat(const Date *date) ;

/**
 * @fn void setAnnee_Dat(Date date, signed int int) ;
 * @brief initialise l'année de la date
 *
 * @param[in, out] date date à modifier
 * @param année
 */
void setAnneeDat(Date *date, const unsigned int annee) ;

/**
 * @fn signed int getAnnee_Dat(const Date date) ;
 * @brief récupère l'annee de date
 *
 * @param date
 * @return l'annee de date
 */
unsigned char getHeureDat(const Date *date);

/**
 * @fn void setAnnee_Dat(Date date, signed int int) ;
 * @brief initialise l'année de la date
 *
 * @param[in, out] date date à modifier
 * @param année
 */
void setHeureDat(Date *date, const unsigned char heure);

/**
 * @fn signed int getAnnee_Dat(const Date date) ;
 * @brief récupère l'annee de date
 *
 * @param date
 * @return l'annee de date
 */
unsigned char getMinuteDat(const Date *date);

/**
 * @fn void setAnnee_Dat(Date date, signed int int) ;
 * @brief initialise l'année de la date
 *
 * @param[in, out] date date à modifier
 * @param année
 */
void setMinuteDat(Date *date, const unsigned char heure);


/**
 * @fn char * getDate_Dat(Date *date);
 * @brief récupère la date complète.
 *
 * @param[in, out] date date à récupérer.
 */

char * getDateDat(const Date *date);

/**
 * @fn char * getTempsDat(Date *date);
 * @brief récupère la Temps complète.
 *
 * @param[in, out] date date à récupérer.
 */
char * getTempsDat(const Date *date);

/**
 * @fn char * getTempsDat(Date *date);
 * @brief récupère la Temps complète.
 *
 * @param[in, out] date date à récupérer.
 */
char * getDate(const Date *date);

/**
 * @fn void affDat(const Date *date);
 * @brief Afficher l'date.

 * @param[in] date pointeur vers l'date.
 * @return 0 si tout est OK
 */
void affDat(const Date *date);

/**
 * @fn void regression_Dat() ;
 * @brief Test le module Date
 */
void regDat();

#endif
